package com.leetone;


/**
* @ClassName: LocalThreadTest
* @Description: 【线程副本的使用,保证了线程虽然有共享资源，但不会相互影响】
* @date 2018年8月28日 下午3:33:13
* @Company: 上海未泰信息技术有限公司
* @author:[谭磊][leetone123@163.com]
*/
public class LocalThreadTest {
	/*
	 * 通过匿名内部类覆盖initialValue方法，指定初始值
	 */
	private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>() {
		public Integer initialValue() {
			return 0;
		}
	};
	
	public ThreadLocal<Integer> getThreadLocal(){
		return seqNum;
	}
	/*
	 * 获取下一个序列值
	 */
	public int getNextNum() {
		seqNum.set(seqNum.get()+1);
		return seqNum.get();
	}
	
	private static class TestClient extends Thread{
		private LocalThreadTest sn;
		public TestClient(LocalThreadTest sn) {
			this.sn = sn;
		}
		@Override
		public void run() {
			super.run();
			for(int i=0;i<3;i++)
			{
				//每个线程打出3个序列值
				System.out.println("线程：\t"+Thread.currentThread().getName()+"的sn:\t"+sn.getNextNum());
				//每个线程用完后记得删除
			}
			sn.getThreadLocal().remove();
		}
	}
	public static void main(String[] args) {
		LocalThreadTest sn = new LocalThreadTest();
		//3个线程共享sn,各自生产序列号
		TestClient t1 = new TestClient(sn);
		TestClient t2 = new TestClient(sn);
		TestClient t3 = new TestClient(sn);
		t1.start();
		t2.start();
		t3.start();
	}
}
